package main

import (
	"fmt"
)

/*
柯里化（Currying）: 是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数，并且返回接受余下的参数且返回结果的新函数的技术.
柯里化是很多高级编程语言拥有的特性，比如：JS、scala。
柯里化的好处：
1、参数复用。
2、提前返回。
3、 延迟计算/运行。

作者：杰森陈
链接：https://juejin.cn/post/7040813656371625998
来源：稀土掘金
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
*/

// 实现函数只执行一次
func onceFunc(f func()) func() {
	var flag bool
	return func() {
		if !flag {
			f()
			flag = true
		}
	}
}

func testFunc() {
	fmt.Println("我只能运行一次")
}

func main() {
	f := onceFunc(testFunc)
	for i := 0; i < 10; i++ {
		f()
	}
}
